﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace mrp16062010.Simulation.Siralama
{
    static class SiralaExtension
    {
        public static List<IsParcasi> Sirala(this List<IsParcasi> gelen, Simulation.Kuyruk.IslemTipi tip)
        {
            List<IsParcasi> liste = gelen;
           
            switch (tip)
            {   
                case Kuyruk.IslemTipi.Fifo:
                    liste = liste.Fifo();
                    break;
                case Kuyruk.IslemTipi.Lifo:
                    liste = liste.Lifo();
                    break;
                case Kuyruk.IslemTipi.EarlyDoDate:
                    liste = liste.EarlyDoDate();
                    break;
                case Kuyruk.IslemTipi.ShortestProcessTime:
                    liste = liste.ShortestProcessTime();
                    break;
                case Kuyruk.IslemTipi.LongestProcessTime:
                    liste = liste.LongestProcessTime();
                    break;
                case Kuyruk.IslemTipi.CriticalRatio:
                    liste = liste.CriticalRatio();
                    break;
                case Kuyruk.IslemTipi.ShortestOperationNumber:
                    liste = liste.ShortestOperationNumber();
                    break;
                case Kuyruk.IslemTipi.LongestOperationNumber:
                    liste = liste.LongestOperationNumber();
                    break;
                case Kuyruk.IslemTipi.ShortestLeftOperationTime:
                    liste = liste.ShortestLeftOperationTime();
                    break;
                case Kuyruk.IslemTipi.LongestLeftOperationTime:
                    liste = liste.LongestLeftOperationTime();
                    break;
                default:
                    break;
            }
             
            
            return liste;
        }

        private static List<IsParcasi> Fifo(this List<IsParcasi> gelen)
        {
            List<IsParcasi> liste = (from x in gelen
                                     orderby x.SimulasyonBilgisi.GirisBeklemeTarihi.BaslangicTarihi ascending
                                     select x).ToList<IsParcasi>();
            return liste;
        }

        private static List<IsParcasi> Lifo(this List<IsParcasi> gelen)
        {
            List<IsParcasi> liste = (from x in gelen
                                     orderby x.SimulasyonBilgisi.GirisBeklemeTarihi.BaslangicTarihi descending
                                     select x).ToList<IsParcasi>();
            return liste;
        }

        private static List<IsParcasi> EarlyDoDate(this List<IsParcasi> gelen)
        {
            List<IsParcasi> liste = (from x in gelen
                                     orderby x.BitTarihi ascending //x.SiparisBilgi.TarihBilgisi.BitisTarihi ascending
                                     select x).ToList<IsParcasi>();
            return liste;
        }

        private static List<IsParcasi> ShortestProcessTime(this List<IsParcasi> gelen)
        {
            List<IsParcasi> liste = (from x in gelen
                                     orderby x.Uzunluk ascending
                                     select x).ToList<IsParcasi>();
            return liste;
        }

        private static List<IsParcasi> LongestProcessTime(this List<IsParcasi> gelen)
        {
            List<IsParcasi> liste = (from x in gelen
                                     orderby x.Uzunluk descending
                                     select x).ToList<IsParcasi>();
            return liste;
        }

        private static List<IsParcasi> CriticalRatio(this List<IsParcasi> gelen)
        {
            List<IsParcasi> liste = (from x in gelen
                                     orderby x.KritikOran ascending
                                     select x).ToList<IsParcasi>();
            return liste;
        }

        private static List<IsParcasi> ShortestOperationNumber(this List<IsParcasi> gelen)
        {
            List<IsParcasi> liste = (from x in gelen
                                     orderby x.IslenecekOperasyonSayisi() ascending
                                     select x).ToList<IsParcasi>();
            return liste;
        }

        private static List<IsParcasi> LongestOperationNumber(this List<IsParcasi> gelen)
        {
            List<IsParcasi> liste = (from x in gelen
                                     orderby x.IslenecekOperasyonSayisi() descending
                                     select x).ToList<IsParcasi>();
            return liste;
        }

        private static List<IsParcasi> ShortestLeftOperationTime(this List<IsParcasi> gelen)
        {
            List<IsParcasi> liste = (from x in gelen
                                     orderby x.IslenecekOperasyonSuresi() ascending
                                     select x).ToList<IsParcasi>();
            return liste;
        }

        private static List<IsParcasi> LongestLeftOperationTime(this List<IsParcasi> gelen)
        {
            List<IsParcasi> liste = (from x in gelen
                                     orderby x.IslenecekOperasyonSuresi() descending
                                     select x).ToList<IsParcasi>();
            return liste;
        }
    }
}
